package main

import "fmt"

func main() {
	/*
		变量表示没有固定值且可改变的数，可以变化的量。
		=是赋值，就是把等号右边的值，赋值给左边变量的意思。
	*/
	//name 变量,name在内存里面是找不到的，存的是一串地址
	/*
		var name string = "kuangshen"
		name = "zhangsan"
		var age int = 18
		fmt.Println(name, age)
		/*
						1.在go语言中，我们声明一个变量一般使用 var 关键字：
						   var name type
						   -第一个 var 是声明变量的关键字，是固定的写法，记住即可。声明一个变量，就需要一个var。
						   -第二个name，就是变量的名字，可以按照自己的需求给变量定一个名字，用来后续使用。
						   -第三个type，就是用来待变变量的类型。
					     变量的命名规则遵循驼峰命名法，首个单词小写，后面的每个单词首字母大写：useFiles和systemInfo.
					     变量定义的标准格式为：
					      var 变量名 变量类型
					      变量声明以关键字var开头，后置变量类型，行尾无需分号
						  优势：可以同时定义多个变量

				        2.我们有时候会批量定义变量，如果每次都单独定义比较麻烦，Go语言支持批量定义变量
					    使用关键字var和括号，可以将一组变量定义放在一起
				        var(
				           addr string
			               phone string
			            )
	*/
	/*
		var定义变量，如果没有赋值，变量就默认是这个类型的默认值
		var (
			addr  string
			age   int
			phone string
		)

	*/
	/*
			：= 自动推导
			短变量声明并初始化
			addr := "山东省济南市历城区"
			age := 18
			phone := "苹果"
			fmt.Printf("%T,%T,%T", addr, age, phone)
		    这是go语言的推导声明写法，编译器会自动根据右值类型推断出左值的对应类型。
		    它可以自动的推导出一些类型，但是使用也是有限制的：
			1.定义变量，同时显示初始化。
			2.不能提供数据类型。
			3.只能用在函数内部，不能随便到处定义。
	*/
	/*
		addr := "山东省济南市历城区"
		age := 18
		phone := "苹果"
		//string默认值：空.字符串变量的默认值为空字符串
		//int默认值：0
		//整型和浮点型变量的默认值为0和0.0.
		//布尔型变量默认为false
		//切片、函数、指针变量的默认为nil
		fmt.Println(addr, age, phone)
		fmt.Printf("%T,%T,%T", addr, age, phone)

	*/
	/*
			理解变量(内存地址)
		    var num int
		    num = 1000
		    fmt.Println("num的值:%d,内存地址:%p\n",num,&num)

			num = 2000
			fmt.Println("num的值:%d,内存地址:%p\n",num,&num)
	*/
	var num int
	num = 1000
	fmt.Println("%d,内存地址:%p", num, &num)

	num = 2000
	fmt.Println("%d,内存地址:%p", num, &num)
}
